package logger

import (
	"os"

	"apiGateWay/internal/config"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"

	"github.com/gin-gonic/gin"
)

var (
	zapLogger *zap.Logger
	sugar     *zap.SugaredLogger
)

// Init 初始化日志器
func Init(cfg *config.LoggerConfig) {
	var zapConfig zap.Config

	// 根据配置设置日志级别
	switch cfg.Level {
	case "debug":
		zapConfig = zap.NewDevelopmentConfig()
	case "info", "warn", "error":
		zapConfig = zap.NewProductionConfig()
	default:
		zapConfig = zap.NewProductionConfig()
	}

	zapConfig.EncoderConfig.TimeKey = "timestamp"
	zapConfig.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder

	// 设置日志格式
	if cfg.Format == "json" {
		zapConfig.Encoding = "json"
	} else {
		zapConfig.Encoding = "console"
	}

	var err error
	zapLogger, err = zapConfig.Build()
	if err != nil {
		panic(err)
	}
	defer zapLogger.Sync()

	sugar = zapLogger.Sugar()
}

// Info 记录信息日志
func Info(msg string, keysAndValues ...interface{}) {
	if sugar != nil {
		sugar.Infow(msg, keysAndValues...)
	}
}

// Infof 格式化信息日志
func Infof(template string, args ...interface{}) {
	if sugar != nil {
		sugar.Infof(template, args...)
	}
}

// Infow 带键值对的信息日志
func Infow(msg string, keysAndValues ...interface{}) {
	if sugar != nil {
		sugar.Infow(msg, keysAndValues...)
	}
}

// Error 记录错误日志
func Error(msg string, keysAndValues ...interface{}) {
	if sugar != nil {
		sugar.Errorw(msg, keysAndValues...)
	}
}

// Errorf 格式化错误日志
func Errorf(template string, args ...interface{}) {
	if sugar != nil {
		sugar.Errorf(template, args...)
	}
}

// Warn 记录警告日志
func Warn(msg string, keysAndValues ...interface{}) {
	if sugar != nil {
		sugar.Warnw(msg, keysAndValues...)
	}
}

// Warnf 格式化警告日志
func Warnf(template string, args ...interface{}) {
	if sugar != nil {
		sugar.Warnf(template, args...)
	}
}

// Fatal 记录致命错误并退出
func Fatal(msg string, keysAndValues ...interface{}) {
	if sugar != nil {
		sugar.Fatalw(msg, keysAndValues...)
	}
	os.Exit(1)
}

// Fatalf 格式化致命错误并退出
func Fatalf(template string, args ...interface{}) {
	if sugar != nil {
		sugar.Fatalf(template, args...)
	}
	os.Exit(1)
}

// GinLogger Gin 中间件日志
func GinLogger() gin.HandlerFunc {
	return gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
		if sugar != nil {
			sugar.Infow("HTTP Request",
				"status", param.StatusCode,
				"method", param.Method,
				"path", param.Path,
				"ip", param.ClientIP,
				"latency", param.Latency,
				"error", param.ErrorMessage,
			)
		}
		return ""
	})
}

